# -*- coding: utf-8 -*-
'''
混合空间增强
1.对原始图像进行拉普拉斯锐化----与原始图像相加
2.对原始图像进行索贝尔梯度处理----5*5均值滤波平滑处理
3.将1得到的拉普拉斯锐化图像与2得到的平滑图像相乘---掩蔽图像
4.原始图像+掩蔽图像=锐化增强图像
5.对锐化增强图像进行灰度幂律变化----得到最终结果
'''

from skimage import data,filters
from matplotlib import pyplot as plt
import numpy as np

#图像空间滤波函数
def correl2d(img,window):
    m=window.shape[0]#窗口行度
    n=window.shape[1]#窗口列长度
    #在原始图像的维度上行和列个增加两行
    img1=np.zeros((img.shape[0]+m-1,img.shape[1]+n-1))
    #将img1图像边缘四周用0灰度值填充
    img1[(m-1)//2:(img.shape[0]+(m-1)//2),(n-1)//2:(img.shape[1]+(n-1)//2)]=img
    img2=np.zeros(img.shape)#相同维度
    for i in range(img2.shape[0]):
        for j in range(img2.shape[1]):
            temp=img1[i:i+m,j:j+n]
            #两矩阵相乘
            img2[i,j]=np.sum(np.multiply(temp,window))
    return img2


#对图像进行索贝尔算子处理            
def sobel(img,window_mean):
    img_sobel=filters.sobel(img)
    #使用均值滤波器平滑后的sobel图像
    img_sobel_mean=correl2d(img_sobel,window_mean)
    return img_sobel_mean


def main(img,img_laplace,img_sobel_mean):
    #相相乘得到锐化结果
    img_mask=img_laplace*img_sobel_mean
    #与原始图像相加得到锐化增强图像
    img_sharp_enhance=img+img_mask
    #进行灰度幂律变换得到最终结果
    img_enhance=img_sharp_enhance**0.5
    return img_enhance

#导入图像
img=data.camera()    
#window使用中心系数为正的扩展的拉普拉斯算子形式
window=np.array([[-1,-1,-1],[-1,8,-1],[-1,-1,-1]])
#得到拉普拉变换后的图像
img_laplace=correl2d(img,window)
img_laplace=255*(img_laplace-img_laplace.min())/(img_laplace.max()-img_laplace.min())
#plt.imshow(img_laplace)
#锐化增强图像
img_laplace_enhance=img+img_laplace

#索贝尔算法
#使用5*均值滤波器平滑后的sobel图像
window_mean=np.ones((5,5))/(5**2) 

img_sobel_mean=sobel(img,window_mean)
#plt.imshow(img_sobel_mean)

#最终结果
img_enhance=main(img,img_laplace,img_sobel_mean)
#plt.imshow(img_enhance,cmap='gray')




#显示结果
#imglist=[img,img_laplace,img_laplace_enhance,img_sobel_mean,img_enhance]
#for k in imglist:
#    plt.figure()
#    plt.axis('off')
#    plt.imshow(k,cmap='gray')
           
